#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QStandardItemModel>
#include <QTableView>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
class MyThread;  // 前向声明
class DirData;
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public:
    QTableView* getTableView();//获取视图指针
    QStandardItemModel* getScandingmodel();
    QStandardItemModel* getScannedmodel();

     void mapInsert(QString& name,MyThread* ptr);//向_map中添加元素
    void scandedInsert(QString& name,QStandardItemModel* model);//插入键值对
    void scandingInsert(QString& name,QStandardItemModel* model);//插入键值对
    void scanding_remove(QString& name);//从正在扫描map中清除

    void setWarningQmessage(const QString& text);//设置一个警告对话框
    void setQuestionQmessage(const QString &text);//设置一个提问对话框

    QStandardItemModel* getModel();//创建模型
    int modelAddData(QStandardItemModel* model,QString& dirname);//添加数据到指定的model中
    void modelRemoveData(QStandardItemModel* model,int targetrow);//删除指定的model中的数据
    bool findDir(QMap<QString,QStandardItemModel*>& tmp,QString& name);//判断指定的文件夹是否存在
signals:
    void upateData(int value);//更新进度条的信号
private slots:
    void setValue(int value);//更新进度条的槽函数
    void handleButtonClick(QAbstractButton* button);
    void on_pushButton_stop_clicked();
    void on_pushButton_start_clicked();
    void on_lineEdit_textEdited(const QString &arg1);
    void on_listView_scanding_doubleClicked(const QModelIndex &index);
    void on_lineEdit_editingFinished();
private:
    QStandardItemModel* scanned_model;
    QStandardItemModel* scanding_model;
private:
    Ui::Widget *ui;
    QVector<QString> _queue;//用来保存扫描的文件夹
    QVector<MyThread*> threads;//用来保存线程指针，可以通过线程指针操作线程
    int threads_num = 5;//设置同时可以工作的最大线程数量和文件夹数量
    QMessageBox msgBox;
    QString change_dirname;
protected:
    QMap<QString,QStandardItemModel*>  scanned_dir;//用来保存已经扫描过的历史文件夹和模型
    QMap<QString,QStandardItemModel*>  scanding_dir;//用来保存正在扫描的文件夹和模型
    QMap<QString,MyThread*> _map;//用来保存正在扫描的文件夹与负责其扫描的线程指针的映射
};
#endif // WIDGET_H
